"""LLM 博客生成器 2.0

根据用户输入的面试题目的内容生成博客内容并保存到本地
"""

from os.path import join, exists
from string import Template
import time

import fire
from loguru import logger
import markdown
from bs4 import BeautifulSoup

from ai_assistant.tool.cmd_tool import run_command_in_dir
from ai_assistant.tool.extract_code_tool import extract_code_block
from ai_assistant.llm.moonshot.assistant import Message, MoonshotAssistant
from ai_assistant.config.path import DirPath


blog_content_prompt_template = """
面试题目如下：$input

请根据面试题目并结合以下要求生成markdown格式的博客文章，并只返回markdown格式的数据：```markdown\n...```：
1. 需要有目录结构，例如包括以下三个部分：`思路分析`、`解法对比`、`总结`。
2. `解法对比`部分给出多种解法，并给出时间复杂度的对比分析。
3. 生成的代码每个步骤都要有详细的注释。
4. 对于每一种解法，给出输入数据以及运行结果。
5. 对于每一种解法，解析其核心思想。
"""


def generate_blog_content_prompt(input):
    t = Template(blog_content_prompt_template)
    return t.substitute(input=input)


def save_blog_content(title, content):
    DirPath.make_dir(DirPath.AI_BLOGS)
    blog_save_path = join(DirPath.AI_BLOGS, title + ".md")
    if exists(blog_save_path):
        new_blog_save_path = join(
            DirPath.AI_BLOGS, title + "_" + str(int(time.time())) + ".md"
        )
        logger.warning(
            f"博客已存在于: {blog_save_path}, 改生成到: {new_blog_save_path}"
        )
        blog_save_path = new_blog_save_path

    with open(blog_save_path, "w") as f:
        f.write(content)

    run_command_in_dir(
        command=f'markdown-toc -toc "目录" {blog_save_path}', directory=DirPath.AI_BLOGS
    )


def generate_ai_blog_content(moonshot_api_key: str, input: str):
    aigc = MoonshotAssistant(api_key=moonshot_api_key).chat(
        [
            Message(
                role="system",
                content="你是一个面试题专家，对leetcode等刷题网站上的面试题有很深的理解。",
            ),
            Message(
                role="user",
                content=generate_blog_content_prompt(input=input),
            ),
        ]
    )

    blog = extract_code_block("markdown", aigc)
    if not blog:
        logger.error("生成博客内容失败")
        return
    logger.info(blog)

    html = markdown.markdown(blog)
    logger.info(html)
    soup = BeautifulSoup(html, "html.parser")
    title = soup.find("h1").get_text()
    title = title.replace(" ", "")

    if not title:
        logger.error("提取博客标题失败")
        return
    logger.info(f"博客标题: {title}")

    save_blog_content(title=title, content=blog)
    return blog


if __name__ == "__main__":
    fire.Fire(generate_ai_blog_content)
